#include "psc.h"
#include "os_io.h"

#define PSC0_WAIT_TRANSITION_COMPLETION(x)	while((PSC0_PTSTAT & (0x1 << x)) == 0x1)
#define PSC1_WAIT_TRANSITION_COMPLETION(x)	while((PSC1_PTSTAT & (0x1 << x)) == 0x1)

static inline void dump_psc_regs(void)
{
	uint8_t i = 0;

	printf("PSC0_REVID: 0x%x \n", PSC0_REVID);
	printf("PSC0_INTEVAL: 0x%x \n", PSC0_INTEVAL);
	printf("PSC0_MERRPR0: 0x%x \n", PSC0_MERRPR0);
	printf("PSC0_MERRCR0: 0x%x \n", PSC0_MERRCR0);
	printf("PSC0_PERRPR: 0x%x \n", PSC0_PERRPR);
	printf("PSC0_PERRCR: 0x%x \n", PSC0_PERRCR);
	printf("PSC0_PTCMD: 0x%x \n", PSC0_PTCMD);
	printf("PSC0_PTSTAT: 0x%x \n", PSC0_PTSTAT);
	printf("PSC0_PDSTAT0: 0x%x \n", PSC0_PDSTAT0);
	printf("PSC0_PDSTAT1: 0x%x \n", PSC0_PDSTAT1);
	printf("PSC0_PDCTL0: 0x%x \n", PSC0_PDCTL0);
	printf("PSC0_PDCTL1: 0x%x \n", PSC0_PDCTL1);
	printf("PSC0_PDCFG0: 0x%x \n", PSC0_PDCFG0);
	printf("PSC0_PDCFG1: 0x%x \n", PSC0_PDCFG1);

	for (i = 0; i < 15; i++)
	{
		printf("PSC0_MDSTAT(%x): 0x%x \n", i, PSC0_MDSTAT(i));
		printf("PSC0_MDCTL(%x): 0x%x \n", i, PSC0_MDCTL(i));
	}

	printf("PSC1_REVID: 0x%x \n", PSC1_REVID);
	printf("PSC1_INTEVAL: 0x%x \n", PSC1_INTEVAL);
	printf("PSC1_MERRPR0: 0x%x \n", PSC1_MERRPR0);
	printf("PSC1_MERRCR0: 0x%x \n", PSC1_MERRCR0);
	printf("PSC1_PERRPR: 0x%x \n", PSC1_PERRPR);
	printf("PSC1_PERRCR: 0x%x \n", PSC1_PERRCR);
	printf("PSC1_PTCMD: 0x%x \n", PSC1_PTCMD);
	printf("PSC1_PTSTAT: 0x%x \n", PSC1_PTSTAT);
	printf("PSC1_PDSTAT0: 0x%x \n", PSC1_PDSTAT0);
	printf("PSC1_PDSTAT1: 0x%x \n", PSC1_PDSTAT1);
	printf("PSC1_PDCTL0: 0x%x \n", PSC1_PDCTL0);
	printf("PSC1_PDCTL1: 0x%x \n", PSC1_PDCTL1);
	printf("PSC1_PDCFG0: 0x%x \n", PSC1_PDCFG0);
	printf("PSC1_PDCFG1: 0x%x \n", PSC1_PDCFG1);

	for (i = 0; i < 15; i++)
	{
		printf("PSC1_MDSTAT(%x): 0x%x \n", i, PSC1_MDSTAT(i));
		printf("PSC1_MDCTL(%x): 0x%x \n", i, PSC1_MDCTL(i));
	}
	return;
}


void psc_init(void)
{
	// Enable SD card module
	PSC0_WAIT_TRANSITION_COMPLETION(0);	// power domain 0
	PSC0_MDCTL(5) = 0x03;	// next state is enabled
	PSC0_PTCMD = 0x01;	// Start transition
	PSC0_WAIT_TRANSITION_COMPLETION(0);		// power domain 0

	printf("New module state: 0x%x\n", PSC0_MDSTAT(5));
	//dump_psc_regs();
	return;
}

